package com.cong.modules.sys.controller;

import com.cong.common.vo.AjaxResultVo;
import com.cong.config.OssConfig;
import com.cong.modules.base.BaseController;
import com.cong.modules.oss.OssFactory;
import com.cong.modules.oss.SysFile;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import javax.annotation.Resource;
import org.apache.commons.collections4.map.HashedMap;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * 上传接口控制器
 */
@RestController
@RequestMapping("/sysfile")
public class UploadController extends BaseController {

	@Resource
	private OssConfig ossConfig;

	/**
	 * 通用上传请求 (单个文件)
	 *
	 * @param file 文件数据
	 * @return 返回文件上传结果
	 */
	@PostMapping("/upload")
	@ResponseBody
	public Map<String, Object> uploadImageFile(MultipartFile file) {
		Map<String, Object> resultMap = new HashedMap<>();
		try {
			if (file == null) {
				resultMap.put("error", "请选择文件！");
			} else {
				SysFile sysFile = Objects.requireNonNull(OssFactory.init(ossConfig)).uploadFile(file, true);
				resultMap.put("fileName", sysFile.getOriginalName());
				resultMap.put("fileUrl", sysFile.getFileFullPath());
			}
			return resultMap;
		} catch (Exception e) {
			logger.error("文件上传失败", e);
			resultMap.put("error", "服务器异常请联系管理员！");
			return resultMap;
		}
	}

	/**
	 * 通用上传请求（多个文件）
	 *
	 * @param file 文件数据
	 * @return 返回文件上传结果
	 */
	@PostMapping("/uploads")
	@ResponseBody
	public Map<String, Object> uploadFiles(MultipartFile[] file) throws Exception {
		Map<String, Object> resultMap = new HashedMap<>();
		try {
			if (file != null && file.length > 0) {
				List<SysFile> fileInfos = new LinkedList<>();
				for (MultipartFile tempFile : file) {
					SysFile sysFile = Objects.requireNonNull(OssFactory.init(ossConfig)).uploadFile(tempFile, true);
					fileInfos.add(sysFile);
				}
				resultMap.put("fileList", fileInfos);
			} else {
				resultMap.put("error", "请选择文件！");
			}
			return resultMap;
		} catch (Exception e) {
			resultMap.put("error", e.getMessage());
			return resultMap;
		}
	}

	/**
	 * 删除上传文件
	 *
	 * @param filePath 文件路径
	 * @return 返回删除文件结果
	 */
	@PostMapping("/deleteFiles")
	@ResponseBody
	public AjaxResultVo deleteFiles(String filePath) {
		if (StringUtils.isNotBlank(filePath)) {
			Objects.requireNonNull(OssFactory.init(ossConfig)).delete(filePath);
			return AjaxResultVo.success("删除成功！");
		}
		return AjaxResultVo.error("删除失败");
	}

}
